/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ControleAcademico.View;

import ControleAcademico.Model.Dao.TurmaDaoImp;
import ControleAcademico.Model.Pojo.Aluno;
import ControleAcademico.Model.Pojo.Turma;
import ControleAcademico.Model.Pojo.Disciplina;
import ControleAcademico.Model.Pojo.Professor;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.*;

/**
 *
 * @author arthur
 * @author renan
 * @author tais
 * @author vinicius
 */
public class MenuTurma {
    
    
    // Atributos
    private TurmaDaoImp turmaDao;
    
    // Metodos  
    public MenuTurma(){
        
    }
    
   public void criaListaVazia() {
        this.turmaDao = new TurmaDaoImp();
    }
    
    public TurmaDaoImp getTurmaDao() {return this.turmaDao;};
    
    public void criarTurma(MenuDisciplina menuDisciplina, MenuProfessor menuProfessor){

        
        System.out.println("Informe o ID da disciplina que sera oferecida nessa turma:");
        
        for(Disciplina d : menuDisciplina.getDisciplinaDao().obterLista()) {
            System.out.println(d.toString());
        }
        int disciplinaID = Console.readInteger();
        
        Disciplina disciplinaEncontrada = null;
        try {
            disciplinaEncontrada = menuDisciplina.getDisciplinaDao().buscar(disciplinaID);
        } catch (IOException e) {
            System.out.println("Disciplina não encontrada.");
        }
        
        

        ArrayList<Professor> listaProfessores = new ArrayList<Professor>();
        String inserirProfessor = "s";    
        do {
            System.out.println("Informe o ID do professor que lecionará nesta turma:");
            
            for(Professor p : menuProfessor.getProfessorDao().obterLista()) {
                System.out.println(p.toString());
            }
            
            int professorId = Console.readInteger();    
            
            Professor professorEncontrado = null;
            try {
                professorEncontrado = menuProfessor.getProfessorDao().buscar(professorId);
                if(professorEncontrado != null) {
                    listaProfessores.add(professorEncontrado);
                }
            } catch (IOException e) {
                System.out.println("Professor não encontrado.");
            }

            

            System.out.println("Deseja inserir mais um professor? (S/N)");
            inserirProfessor = Console.readString();
            
        } while(inserirProfessor.equals("s") || inserirProfessor.equals("S"));
            
        System.out.println("Informe o ano da turma: \n");
        int ano = Console.readInteger();
        System.out.println("Informe o período da turma: \n");
        int periodo = Console.readInteger();
        System.out.println("Informe o local da turma: \n");
        String local = Console.readString();      
        System.out.println("Informe o horario da turma: \n");
        String horario = Console.readString();
        System.out.println("Informe o número de vagas oferecidas: \n");
        int numeroVagas = Console.readInteger();
                
        int id = this.turmaDao.obterLista().size() + 1;
                
        Turma turma = new Turma(ano,periodo,local,horario,numeroVagas,
                        disciplinaEncontrada,listaProfessores, id);

        
        try {
            this.turmaDao.adicionar(turma);

        } catch (IOException ex) {
            System.out.println("Turma não inserida.\nTurma já consta na lista.");
        }

         try {
            for (Professor p : listaProfessores) {
                menuProfessor.getProfessorDao().buscar(p.getId()).adicionarTurma(turma);
            }
            
        } catch (IOException ex) {
            System.out.println("Erro ao inserir Turma.\nTurma no professor.");
        } 
        
    }
    
    
    public void inserirAluno(MenuAluno menuAluno, MenuTurma menuTurma) {
       
        
        String inserirMais;
          do {
             
            // Obtendo turma  
            System.out.println("Informe o ID da turma que deseja cadastrar alunos:");
            
            for(Turma t : menuTurma.getTurmaDao().obterLista()) {
                System.out.println(t.toString());
            }
            
            int turmaId = Console.readInteger();    
            
            Turma turmaEncontrada = null;
            try {
                turmaEncontrada = menuTurma.getTurmaDao().buscar(turmaId);
            } catch (IOException e) {
                System.out.println("Turma não encontrada.");
                return;
            }              
              
              
            // Obtendo aluno  
            System.out.println("Informe o ID do aluno matriculado nesta turma:");
            
            for(Aluno p : menuAluno.getAlunoDao().obterLista()) {
                System.out.println(p.toString());
            }
            
            int alunoId = Console.readInteger();    
            
            Aluno alunoEncontrado = null;
            try {
                alunoEncontrado = menuAluno.getAlunoDao().buscar(alunoId);
                if(alunoEncontrado != null) {
                    this.getTurmaDao().getListaTurmas().get(turmaEncontrada.getId() - 1).getAlunos().add(alunoEncontrado);
                    menuAluno.getAlunoDao().getListaAlunos().get(alunoId - 1).getTurmas().add(turmaEncontrada);
                }
            } catch (IOException e) {
                System.out.println("Aluno não encontrado.");
                return;
            }

            

            System.out.println("Deseja inserir mais alunos? (S/N)");
            inserirMais = Console.readString();
            
        } while(inserirMais.equals("s") || inserirMais.equals("S"));      
        
    }
    
    
    public void salvar(MenuProfessor menuProfessor) {
        
        try {
            File arquivo;  
  
            arquivo = new File("Turmas.txt");  
            FileOutputStream fos = new FileOutputStream(arquivo);
            
            fos.write(("Id\tDisciplina(ID)\tAno\tPeríodo\tLocal"
                    + "\tHorário\tNúmero de Vagas\t\tProfessores(ID):\n").getBytes());
            
            for (Turma a : getTurmaDao().obterLista()) {
                String escrita = (a.getId() + "\t" + a.getDisciplina().getId() + "\t"
                        + a.getAno() + "\t" + a.getPeriodo() + "\t" + a.getLocal() 
                        + "\t" + a.getHorario() + "\t" + a.getNumeroVagas() + "\t");
                fos.write(escrita.getBytes());
            
                for(Professor p: menuProfessor.getProfessorDao().obterLista()) {                  
                    if(p.getListaTurmas().contains(a) == true){
                        escrita = (p.getId() + "\t");
                        fos.write(escrita.getBytes());
                    }
                }
                fos.write("\n".getBytes());
            }
            
            fos.close();

        }catch (Exception e) {  
            System.out.println(e);
        }
    
    }
    
        public void load(MenuProfessor menuProfessor, MenuDisciplina menuDisciplina) {
        
        try {
            
            File entrada = new File("Turmas.txt");
            InputStream leituraEntrada = new  FileInputStream(entrada);
            InputStreamReader leituraStream = new InputStreamReader(leituraEntrada);  
            BufferedReader leituraBuffer = new BufferedReader(leituraStream);

            String linha = leituraBuffer.readLine();
            this.criaListaVazia();
     
            while(linha!= null) {
                String s[] = linha.split("\\t");
                
                int i = 7;
                ArrayList<Professor> listaProfessor = new ArrayList<Professor>();
                Professor professor = null;
                while(s[i].equals("\n")) {
                    
                    // Encontra os professores
                    professor = null; 
                    try {
                        professor = menuProfessor.getProfessorDao().buscar(Integer.parseInt(s[i]));
                     } catch (IOException e) {
                       System.out.println("Professor não encontrado.");
                       return;
                     }   
                     listaProfessor.add(professor);
                     i++;
                }
                
                // Encontra a disciplina
                Disciplina disciplina = null; 
                try {
                    disciplina = menuDisciplina.getDisciplinaDao().buscar(Integer.parseInt(s[6]));
                 } catch (IOException e) {
                    System.out.println("Professor não encontrado.");
                    return;
                 }   
                
                
                Turma novaTurma = new Turma(Integer.parseInt(s[1]),Integer.parseInt(s[2]),
                        s[3],s[4],Integer.parseInt(s[5]),disciplina,listaProfessor,Integer.parseInt(s[0]));
                
                int index = menuProfessor.getProfessorDao().getLista().indexOf(professor);
                
                if(index > -1) {
                    menuProfessor.getProfessorDao().getLista().get(index).adicionarTurma(novaTurma);
                } else {
                    System.out.println("Professor não consta na lista.");
                    return;
                }
                
                this.getTurmaDao().adicionar(novaTurma);
                linha = leituraBuffer.readLine();
            }
 

            leituraBuffer.close();
            leituraStream.close();
            leituraEntrada.close();
  
        }catch (Exception ee) {  
            System.out.println("Erro na leitura do arquivo.");
            ee.printStackTrace();  
        }
    }
    
}
